'''
Author: 红色梧桐 940120450@qq.com
Date: 2024-05-10 16:15:18
LastEditors: 红色梧桐 940120450@qq.com
LastEditTime: 2024-09-05 20:57:05
FilePath: \myReader\applications\configs\log.py
Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
'''
import os
import logging
from logging.config import dictConfig
from logging.handlers import TimedRotatingFileHandler, QueueListener
import queue
import atexit
import portalocker

# 获取路径
def path_check():
    Base_path = os.path.abspath(os.path.dirname(__file__))
    path = os.path.abspath(os.path.join(Base_path,'..'))
    path = os.path.abspath(os.path.join(path,'..'))
    path = os.path.join(path,'logs')
    if not os.path.exists(path):
        os.mkdir(path)
    return path

file_name = os.path.join(path_check(), 'app.log')

# 创建日志队列
log_queue = queue.Queue()
format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'

# 定义日志配置
LOGGING_CONFIG = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'default': {
            'format': format,
        },
    },
    'handlers': {
        'queue': {
            'class': 'logging.handlers.QueueHandler',
            'queue': log_queue,
            'level': 'INFO',
        },
        'file': {
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': file_name,                # 日志文件名
            'when': 'midnight',                   # 每天午夜切割日志
            'interval': 1,                        # 切割时间间隔（1天）
            'backupCount': 7,                     # 保留日志文件的个数（7天）
            'formatter': 'default',               # 使用的格式化器
            'encoding': 'utf-8',                  # 文件编码
            'level': 'INFO',
        },
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'default',
            'level': 'INFO',
        },
    },
    'loggers': {
        '': {
            'handlers': ['queue', 'console'],
            'level': 'INFO',
        },
        'werkzeug': {
            'handlers': ['console'],
            'level': 'INFO',
            'propagate': False,
        }
    },
}

# 应用日志配置
dictConfig(LOGGING_CONFIG)

class SafeTimedRotatingFileHandler(TimedRotatingFileHandler):
    def _open(self):
        stream = super()._open()
        # portalocker.lock(stream, portalocker.LOCK_EX)
        return stream
    
# 获取实际的文件处理器对象
file_handler = LOGGING_CONFIG['handlers']['file']
if isinstance(file_handler, dict):
    file_handler = SafeTimedRotatingFileHandler(filename=file_handler['filename'], when=file_handler['when'], interval=file_handler['interval'], backupCount=file_handler['backupCount'], encoding=file_handler['encoding'], delay=True)
    file_handler.setFormatter(logging.Formatter(format))

# 创建日志监听器
queue_listener = QueueListener(log_queue, file_handler)
queue_listener.start()

# 在应用关闭时停止监听器
atexit.register(queue_listener.stop)